package game;

import java.io.*;
import java.util.*;
import java.awt.Event;
import java.awt.event.*;
import javax.swing.Timer;

/**
 * Classe permettant le deroulement de chaque option d'execution du jeu
 */
public class Moteur {

	/**
	 * debut l'execution du jeu ou l'affichage des differentes options
	 * 
	 * @param args
	 *            : argument(s) donne(s) dans le terminal au lancement du jeu
	 */
	public static void debut(String[] args) {
		Plateau jeu_de_la_vie = new Plateau();
		if (args.length >= 1) {
			if (args[0].equals("-name")) {
				System.out.println("Projet réalisé par : "
						+ "\n-Marco Da Cunha" + "\n-Lisa Delomenie"
						+ "\n-Clément Desmazeaud" + "\n-Sandra Dupré-Pawlak");
			} else if (args[0].equals("-h")) {
				System.out
						.println("Liste des commandes possible :"
								+ "\n-name : affiche les noms et prenoms des participants au projet"
								+ "\n-h : affiche la liste des commandes"
								+ "\n-s d fichier : lis un fichier et fait d itérations sur ce fichier"
								+ "\n-c max fichier : lis un fichier et donne ses caractéristique"
								+ " ainsi que son type sur un maximum de max itérations"
								+ "\n-w max dossier : fait un -c max fichier sur tous les fichiers du dossier");
			} else if (args[0].equals("-s")) {
				try {
					s(args);
				} catch (NotEnoughArgumentsException e) {
					System.out
							.println("-s necessite 2 arguments utilisez -h pour plus d'informations");
				}
			} else if (args[0].equals("-c")) {
				try {
					c(args);
				} catch (NotEnoughArgumentsException e) {
					System.out
							.println("-c necessite 2 arguments utilisez -h pour plus d'informations");
				}
			} else if (args[0].equals("-w")) {
				try {
					w(args);
				} catch (NotEnoughArgumentsException e) {
					System.out
							.println("-w necessite 2 arguments utilisez -h pour plus d'informations");
				}
			}
		} else {
			jeu_de_la_vie.ajout(0, 0);
			jeu_de_la_vie.ajout(0, 1);
			jeu_de_la_vie.ajout(0, 2);
			jeu_de_la_vie.ajout(1, 2);
			jeu_de_la_vie.ajout(2, 2);
			jeu_de_la_vie.ajout(2, 1);
			jeu_de_la_vie.ajout(2, 0);
			jeu_de_la_vie.regles_normales();
			affichageDynamique(-1, jeu_de_la_vie);
		}
	}

	/**
	 * lance le calcule du type d evolution de tous les jeux contenus dans le
	 * dossier passe en parametre
	 * 
	 * @param args
	 *            : arguments entres dans le terminal (un nombre et un dossier)
	 * @throws NotEnoughArgumentsException
	 *             : leve une exception si moins de trois arguments sont entres
	 *             dans le terminal
	 */
	public static void w(String[] args) throws NotEnoughArgumentsException {
		Plateau jeu_de_la_vie = new Plateau();
		if (args.length == 3) {
			try {
				String[] listefichierlif = listerRepertoire(new File(args[2]));
				int x = Integer.parseInt(args[1]);
				Lancer.lire(args[2], jeu_de_la_vie);
				for (int i = 0; i < listefichierlif.length; i++) {
					Comportement.etape6(jeu_de_la_vie, x);
				}
				Html.creation_html(listefichierlif, jeu_de_la_vie, x);
			} catch (FalseDirectoryException e1) {
				System.out.println("Dossier inexistant ou vide");
			} catch (NumberFormatException e2) {
				System.out
						.println("le deuxieme argument de -w doit etre un nombre tapez -h pour plus d'informations");
			} catch (EmptyDirectoryException e3) {
				System.out.println(args[2] + " ne contient aucun fichier lif");
			}
		} else {
			throw new NotEnoughArgumentsException();
		}
	}

	/**
	 * execute une simulation du jeu d une duree donnee, en affichant les
	 * configurations du jeu avec le numero de generation
	 * 
	 * @param args
	 *            : arguments entres dans le terminal (une duree et un fichier
	 *            lif)
	 * @throws NotEnoughArgumentsException
	 *             : leve l'exception si moins de trois arguments sont entres
	 *             dans le terminal
	 */
	public static void s(String[] args) throws NotEnoughArgumentsException {
		Plateau jeu_de_la_vie = new Plateau();
		if (args.length == 3) {
			int x = 0;
			try {
				x = Integer.parseInt(args[1]);
				Lancer.lire(args[2], jeu_de_la_vie);
				affichageDynamique(x, jeu_de_la_vie);
			} catch (NumberFormatException e) {
				System.out
						.println("le deuxieme argument de -s doit etre un nombre tapez -h pour plus d'informations");
			}
		} else {
			throw new NotEnoughArgumentsException();
		}
	}

	/**
	 * lance le calcule du type d evolution du jeu avec ses caracteristiques
	 * (taille de la queue, periode et deplacement) avec une duree maximale de
	 * simulation pour deduire les resultats du calcul.
	 * 
	 * @param args
	 *            : arguments entres dans le terminal (une duree maximale et un
	 *            fichier lif)
	 * @throws NotEnoughArgumentsException
	 *             : leve l'exception si moins de trois arguments sont entres
	 *             dans le terminal
	 */
	public static void c(String[] args) throws NotEnoughArgumentsException {
		Plateau jeu_de_la_vie = new Plateau();
		if (args.length == 3) {
			int x = 0;
			try {
				x = Integer.parseInt(args[1]);
				Lancer.lire(args[2], jeu_de_la_vie);
				Comportement.etape6(jeu_de_la_vie, x);
			} catch (NumberFormatException e) {
				System.out
						.println("le deuxieme argument de -c doit etre un nombre tapez -h pour plus d'informations");
			}
		} else {
			throw new NotEnoughArgumentsException();
		}
	}

	/**
	 * listerRepertoire liste les fichiers d'un dossier dans un tableau
	 * 
	 * @param repertoire
	 *            : dossier contenant des fichiers lif
	 * @return un tableau de chaines de caracteres representant des noms de
	 *         fichiers lif
	 * @throws FalseDirectoryException
	 *             : leve l'exception si le repertoire ne contient pas de
	 *             fichier lif
	 * @throws EmptyDirectoryException
	 *             : leve l'exception si le repertoire est vide
	 */
	public static String[] listerRepertoire(File repertoire)
			throws FalseDirectoryException, EmptyDirectoryException {
		String[] listefichiers;
		ArrayList<String> l = new ArrayList<String>();
		int i;
		int x;
		String s = "";
		listefichiers = repertoire.list();
		if (listefichiers.length > 0) {
			for (i = 0; i < listefichiers.length; i++) {
				s = "";
				x = listefichiers[i].length();
				x = x - 3;
				if (x > 0) {
					for (int j = x; j < listefichiers[i].length(); j++) {
						s += listefichiers[i].charAt(j);
					}
					if (s.equals(".lif") || s.equals(".lif")) {
						l.add(listefichiers[i]);
					}
				}
			}
			String[] listefichierslif = new String[l.size()];
			for (int j = 0; j < listefichierslif.length; j++) {
				listefichierslif[j] = l.get(i);
			}
			if (listefichierslif.length == 0)
				throw new EmptyDirectoryException();
			return listefichierslif;
		} else {
			throw new FalseDirectoryException();
		}
	}

	/**
	 * affichageDynamique affiche dynamiquement les etapes du deroulement du jeu
	 * de la vie
	 * 
	 * @param x
	 *            : determine le nombre d'etapes affichees avant l'arret du jeu
	 * @param jeu_de_la_vie1
	 *            : plateau dont on affiche le jeu
	 */
	static public void affichageDynamique(final int x, Plateau jeu_de_la_vie1) {
		final Plateau jeu_de_la_vie = jeu_de_la_vie1;
		System.out.print((char) Event.ESCAPE + "7");
		Timer t = new Timer(400, new ActionListener() {
			int taille = jeu_de_la_vie.getHauteur();
			int taille2 = jeu_de_la_vie.getLargeur();
			int timer = -1;

			public void actionPerformed(ActionEvent e) {
				timer++;
				if (timer < x) {
					System.out.print((char) Event.ESCAPE + "8");
					String s = jeu_de_la_vie.affichage(taille, taille2);
					System.out.println("timer = " + timer + "\n");
					System.out.println(s);
					taille = jeu_de_la_vie.getHauteur();
					taille2 = jeu_de_la_vie.getLargeur();
					jeu_de_la_vie.setJeu(Modification.simu(jeu_de_la_vie));
				}
			}
			
		});

		t.start();

		try {
			System.in.read();
		} catch (IOException e) {
		}
		
		t.stop();
		
	}
}
